package JVM.第05篇_执行引擎篇;

/**
 * 因为Java 用的是 HotSpot 虚拟机
 * 他是编译器和解释器并存的
 *
 * JIT:即时编译器 - 动态编译器
 * 动态编译(compile during run-time)，
 * 英文称Dynamic compilation; Just In Time也是这个意思。
 * HotSpot对bytecode的编译不是在程序运行前编译的，而是在程序运行过程中编译的。
 * HotSpot里运行着一个监视器(Profile Monitor) ，用来监视程序的运行状况。
 *
 * Java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。
 * 程序运行过程中，那一部分运用频率大，那些对程序的性能影响重要。
 * 对程序运行效率影响大的代码，称为热点(hotspot)，HotSpot会把这些热点动态地编译成机器码(native code) ，
 * 同时对机器码进行优化从而提高运行效率。对那些较少运行的代码，HotSpot 就不会把他们编译。
 *
 * HotSpot对字节码有三层处理:
 *      不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译);
 *      编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了，不要再编译了);
 *      编译并优化(不但把字节码编译成本地代码，而且还进行了优化)
 *
 * 至于哪些程序那些不编译，那些编译，那些优化，则是由监视器(Profile Monitor) 决定
 *
 *
 *
 * AOT:提前编译器 - 静态编译器
 *
 * AOT编译器
 * ●jdk9引入了AOT编译器(静态提前编译器，Ahead Of Time Compiler)
 * ●Java 9引入了实验性AOT编译工具 jaotc。 它借助了Graal 编译器，
 * 将所输入的Java类文件转换为机器码，并存放至生成的动态共享库之中。
 * ●所谓AOT编译，是与即时编译相对立的一个概念。
 * 我们知道，即时编译指的是在程序的运行过程中，将字节码转换为可在硬件上直接运行的机器码，
 * 并部署至托管环境中的过程。而AOT编译指的则是，在程序运行之前，便将字节码转换为机器码的过程。
 *      ●.java -> .class -> .so
 * ●最大好处: Java虛拟机加载已经预编译成二进制库，可以直接执行。不必等待即时编译器的预热，
 * 减少Java应用给人带来“第一次运行慢”的不良体验。
 * ●缺点:
 *      ●破坏了java“一次编译，到处运行”，必须为每个不同硬件、OS编译对应的发行包。
 *      ●降低了Java链接过程的动态性，加载的代码在编译期就必须全部已知。
 * 还需要继续优化中，最初只支持Linux x64 java base
 *
 */
public class C2_为什么说Java是半编译半解释型语言 {

}
